/**
 * 
 */
package com.I9lou.se.lurker.remote;

import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;

/**
 * 搜索命令，封装了一个搜索请求所使用到的参数
 * @author chenwei
 */
public class SearchCommand implements java.io.Serializable {
	
	private static final long serialVersionUID = -276171596677774108L;
		
	/**
	 * 搜索时使用的Query对象，不允许为null
	 */
	private Query query;
	
	/**
	 * 搜索时使用的Filter对象，允许为null
	 */
	private Filter filter;
	
	/**
	 * 排序时使用的Sort对象，允许为null
	 */
	private Sort sort;
	
	/**
	 * 从第几个索引位置获取文档，如果当前搜索命令为count操作，可不设置此值
	 */
	private int startIndex = 0;
	
	/**
	 * 查询的总文档数，如果当前搜索命令为count操作，可不设置此值
	 */
	private int limit = 0;
	
	public SearchCommand() {
		
	}
	
	public SearchCommand(Query query, Filter filter) {
		setQuery(query);
		setFilter(filter);
	}
	
	public SearchCommand(Query query, Filter filter, Sort sort) {
		this(query, filter);
		setSort(sort);
	}

	/**
	 * 获得搜索时使用的Query对象，不允许为null
	 * @return query
	 */
	public Query getQuery() {
		return query;
	}

	/**
	 * 设置搜索时使用的Query对象，不允许为null
	 * @param query
	 */
	public void setQuery(Query query) {
		this.query = query;
	}

	/**
	 * 获得搜索时使用的Filter对象，允许为null
	 * @return
	 */
	public Filter getFilter() {
		return filter;
	}

	/**
	 * 设置搜索时使用的Filter对象，允许为null
	 * @param filter
	 */
	public void setFilter(Filter filter) {
		this.filter = filter;
	}

	/**
	 * 获得排序时使用的Sort对象，允许为null
	 * @return sort
	 */
	public Sort getSort() {
		return sort;
	}

	/**
	 * 设置排序时使用的Sort对象，允许为null
	 * @param sort
	 */
	public void setSort(Sort sort) {
		this.sort = sort;
	}

	/**
	 * 获得从第几个索引位置获取文档，如果当前搜索命令为count操作，可不设置此值
	 * 
	 * @return startIndex
	 */
	public int getStartIndex() {
		return startIndex;
	}

	/**
	 * 设置从第几个索引位置获取文档，如果当前搜索命令为count操作，可不设置此值
	 * @param startIndex
	 */
	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}

	/**
	 * 获得查询的总文档数，如果当前搜索命令为count操作，可不设置此值
	 * @return limit
	 */
	public int getLimit() {
		return limit;
	}

	/**
	 * 设置查询的总文档数，如果当前搜索命令为count操作，可不设置此值
	 * @param limit
	 */
	public void setLimit(int limit) {
		this.limit = limit;
	}
	
	@Override
	public String toString() {
		StringBuilder buffer = new StringBuilder("SearchCommand@{");
		buffer.append("query: \"").append( getQuery() );
		buffer.append("\", filter: \"").append( getFilter() );
		buffer.append("\", sort: \"").append( getSort() );
		buffer.append("\", startIndex: \"").append( getStartIndex() );
		buffer.append("\", limit: \"").append( getLimit() );
		return buffer.append("\"}").toString();
	}
	
}
